<?php
/**
 * 设计模式 -- 简单工厂模式
 *  1、抽象基类:类中定义抽象一些方法，用以在子类中实现
 *  2、继承自抽象基类的子类：实现基类中的抽象方法
 *  3、工厂类：用以实例化化所有相对应的子类
 * Created by PhpStorm.
 * User: Administrator
 * Date: 14-3-24
 * Time: 下午3:11
 */
/**
 * 定义一个抽象类，让子类去继承它,并实现其中的抽象方法
 * Class factory
 */
abstract class  operation {

    //抽象方法不包含方法体    abstract标识，子类必须去实现它
    abstract public  function get_value($num1,$num2);
}

/**
 * 加法实现类
 * Class factory_add
 */
class operation_add extends operation{
    public function __construct(){
        echo '我是加法类<br/>';
    }
    public function get_value($num1,$num2){
        return $num1 + $num2;
    }
}

/**
 * 减法类
 * Class factory_sub
 */
class operation_sub extends operation{
    public function __construct(){
        echo '我是减法类<br/>';
    }
    public function get_value($num1,$num2){
        return $num1 - $num2;
    }
}

/**
 * 乘法类
 * Class factory_mul
 */
class operation_mul extends operation{
    public function __construct(){
        echo '我是乘法类<br/>';
    }
    public function get_value($num1,$num2){
        return $num1 * $num2;
    }
}

class operation_div extends operation{
    public function __construct(){
        echo '我是除法类<br/>';
    }
    public function get_value($num1,$num2){
        try{
            if($num2 == 0){
                throw new Exception('除数不能为0');
            }else{
                return $num1 / $num2;
            }
        }catch (Exception $e){
            echo '错误信息: '.$e->getMessage();
        }
    }
}

/**
 * 工程类，主要用来创建对象
 * 功能：根据输入的运算符号，工厂就能实例化出合适的对象
 * Class factory
 */
class factory{

    public static function create_obj($operate){
        switch($operate){
            case '+':
                return new operation_add();
                break;
            case '-':
                return new operation_sub();
                break;
            case '*':
                return new operation_mul();
                break;
            case '/':
                return new operation_div();
                break;
        }
    }

}

header('Content-Type: text/html;charset=utf-8');
$obj = factory::create_obj('*');
echo $obj->get_value(5,3);